﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using DataAccess;
using Entity;

namespace Controller
{
    public class VendorPOItemController:ControllerBase
    {
        public void AddVendorPOItem(VendorPOItemEntity vendorPoItemEntity)
        {
            VendPOItem vendPoItem = TransformVendorPOItemEntityToVendPOItem(vendorPoItemEntity);
            Sdc.VendPOItems.InsertOnSubmit(vendPoItem);
            Sdc.SubmitChanges();
        }
        public static VendPOItem TransformVendorPOItemEntityToVendPOItem(VendorPOItemEntity vendorPoItemEntity)
        {
            VendPOItem vendPoItem=new VendPOItem();
            vendPoItem.CompleteQty = vendorPoItemEntity.CompleteQty;
            vendPoItem.Lot = vendorPoItemEntity.Lot;
            vendPoItem.Price = vendorPoItemEntity.Price;
            vendPoItem.ProductId = vendorPoItemEntity.ProductId;
            vendPoItem.Remark = vendorPoItemEntity.Remark;
            vendPoItem.RequestDate = vendorPoItemEntity.RequestDate;
            vendPoItem.RequestQty = vendorPoItemEntity.RequestQty;
            vendPoItem.Status = vendorPoItemEntity.Status;
            vendPoItem.VendPOId = vendorPoItemEntity.VendPoId;
            
            return vendPoItem;
        }

        public static VendorPOItemEntity TransformVendorPOItemToVendorPOItemEntity(VendPOItem vendPoItem)
        {
            VendorPOItemEntity vendorPoItemEntity =new VendorPOItemEntity();
            vendorPoItemEntity.CompleteQty = vendPoItem.CompleteQty;
            vendorPoItemEntity.Lot = vendPoItem.Lot;
            vendorPoItemEntity.Price = vendPoItem.Price;
            vendorPoItemEntity.ProductId = vendPoItem.ProductId;
           vendorPoItemEntity.Remark = vendPoItem.Remark;
            vendorPoItemEntity.RequestDate = vendPoItem.RequestDate;
            vendorPoItemEntity.RequestQty = vendPoItem.RequestQty;
            vendorPoItemEntity.OpenQty = vendPoItem.RequestQty - vendPoItem.CompleteQty;
            vendorPoItemEntity.Status = vendPoItem.Status;
            vendorPoItemEntity.VendPoId = vendPoItem.VendPOId;
            vendorPoItemEntity.ProductNo = vendPoItem.Product.No;
            vendorPoItemEntity.ProductName = vendPoItem.Product.Name;
            vendorPoItemEntity.ItemAndRequestedDate =vendPoItem.Product.Name + ", " + vendPoItem.RequestDate;
            vendorPoItemEntity.Id = vendPoItem.Id;
            vendorPoItemEntity.VendorContact = vendPoItem.VendPO.Vendor.Phone;
            vendorPoItemEntity.VendorName = vendPoItem.VendPO.Vendor.ShortName;
            vendorPoItemEntity.VendorNumber = vendPoItem.VendPO.Vendor.Number;
            vendorPoItemEntity.VendorPoNo = vendPoItem.VendPO.No;
            vendorPoItemEntity.Rev = vendPoItem.Product.Revision;
            vendorPoItemEntity.FormatDate = vendPoItem.RequestDate.ToString("d MMM, yyyy");
            vendorPoItemEntity.Amount = vendorPoItemEntity.Price*vendorPoItemEntity.RequestQty;
            vendorPoItemEntity.VendorId = vendPoItem.VendPO.VendId;
            vendorPoItemEntity.NoAndRev = vendorPoItemEntity.VendorPoNo + "/" + vendorPoItemEntity.Rev;
            vendorPoItemEntity.ItemCategory = vendPoItem.Product.Category.Name;

            return vendorPoItemEntity;
        }

        public IList<VendorPOItemEntity> findVendorPOItemsByVendorPOId(int vendorPOId)
        {
            IList<VendPOItem> vendPoItems = (from v in Sdc.VendPOItems
                                             where v.VendPOId == vendorPOId
                                        select v).ToList();
            IList<VendorPOItemEntity> vendorPoItemEntities = new List<VendorPOItemEntity>();
            foreach (var v in vendPoItems)
            {
                VendorPOItemEntity vendorPoItemEntity = TransformVendorPOItemToVendorPOItemEntity(v);
                vendorPoItemEntities.Add(vendorPoItemEntity);
            }
            return vendorPoItemEntities;
        }

        public IList<VendorPOItemEntity> findUncompletedVendorPOItemsByVendorPOId(int vendorPOId)
        {
            IList<VendPOItem> vendPoItems = (from v in Sdc.VendPOItems
                                             where v.VendPOId == vendorPOId && v.Status != "completed"
                                             select v).ToList();
            IList<VendorPOItemEntity> vendorPoItemEntities = new List<VendorPOItemEntity>();
            foreach (var v in vendPoItems)
            {
                VendorPOItemEntity vendorPoItemEntity = TransformVendorPOItemToVendorPOItemEntity(v);
                vendorPoItemEntities.Add(vendorPoItemEntity);
            }
            return vendorPoItemEntities;
        }
        public VendorPOItemEntity findVendorPOItemByVendorPOItemId(int poItemId)
        {
            VendPOItem vendPoItem = (from v in Sdc.VendPOItems
                                     where v.Id == poItemId
                                     select v).SingleOrDefault();
            VendorPOItemEntity vendorPoItemEntity = TransformVendorPOItemToVendorPOItemEntity(vendPoItem);
            return vendorPoItemEntity;
        }

        public int updateVendorPOItem(int vendPoItemId, int qty)
        {
            VendPOItem vendPoItem = (from v in Sdc.VendPOItems
                                     where v.Id == vendPoItemId
                                     select v).SingleOrDefault();
            vendPoItem.CompleteQty = vendPoItem.CompleteQty + qty;
            Sdc.SubmitChanges();
            return vendPoItem.CompleteQty;
        }

        public void updateVendorPOItem(int vendPoItemId, string status,DateTime completeDate)
        {
            VendPOItem vendPoItem = (from v in Sdc.VendPOItems
                                     where v.Id == vendPoItemId
                                     select v).SingleOrDefault();
            vendPoItem.Status = status;
            vendPoItem.CompleteDate = completeDate;
            Sdc.SubmitChanges();
        }

        public IList<VendorPOItemEntity> findAllVendorPOItems()
        {
            IList<VendPOItem> vendPoItems = (from v in Sdc.VendPOItems
                                             where v.Status!="completed"
                                             orderby v.RequestDate ascending 
                                            
                                             select v).ToList();
            IList<VendorPOItemEntity> vendorPoItemEntities = new List<VendorPOItemEntity>();
            foreach (var v in vendPoItems)
            {
                VendorPOItemEntity vendorPoItemEntity = TransformVendorPOItemToVendorPOItemEntity(v);
                vendorPoItemEntities.Add(vendorPoItemEntity);
            }
            return vendorPoItemEntities;
           
        }

        public IList<VendorPOItemEntity> FindVendorPOItemsWithinDays(int p)
        {
            DateTime today = System.DateTime.Now;
            TimeSpan ts1 = new TimeSpan(today.Ticks);
            IList<VendorPOItemEntity> vendorPoItemEntities= this.findAllVendorPOItems();
            IList<VendorPOItemEntity> vendorPoItemEntities1=new List<VendorPOItemEntity>();
            foreach (VendorPOItemEntity vendorPoItemEntity in vendorPoItemEntities)
            {
                TimeSpan ts2=new TimeSpan(vendorPoItemEntity.RequestDate.Ticks);
                TimeSpan ts=ts1.Subtract(ts2).Duration();
                if (vendorPoItemEntity.RequestDate > today && ts.Days <= p)
                {
                    vendorPoItemEntities1.Add(vendorPoItemEntity);
                }
            }
            return vendorPoItemEntities1;
        }




        public void DeleteVendorPOItemByVendorPOId(int vendPOId)
        {
            IList<VendPOItem> vendPoItems = (from v in Sdc.VendPOItems
                                             where v.VendPOId == vendPOId
                                             select v).ToList();
            foreach (VendPOItem vendPoItem in vendPoItems)
            {
                Sdc.VendPOItems.DeleteOnSubmit(vendPoItem);
                Sdc.SubmitChanges();
            }
        }

        public int DeleteVendorPOItemByItemId(int vendorPOItemId)
        {
            //if delete successful, return 0, otherwise return 1.
            int massage = 0;
            try
            {
                VendPOItem vendPoItem = (from v in Sdc.VendPOItems
                                         where v.Id == vendorPOItemId
                                         select v).SingleOrDefault();
                Sdc.VendPOItems.DeleteOnSubmit(vendPoItem);
                Sdc.SubmitChanges();
            }
            catch(Exception ex)
            {
                massage = 1;
            }
            return massage;

        }

        public void UpdateVendorPOItemByVendorPOItemId(VendorPOItemEntity vendorPoItemEntity)
        {
            VendPOItem vendPoItem = (from v in Sdc.VendPOItems
                                     where v.Id == vendorPoItemEntity.Id
                                     select v).SingleOrDefault();
            vendPoItem.ProductId = vendorPoItemEntity.ProductId;
            vendPoItem.RequestDate = vendorPoItemEntity.RequestDate;
            vendPoItem.Price = vendorPoItemEntity.Price;
            vendPoItem.Lot = vendorPoItemEntity.Lot;
            vendPoItem.RequestQty = vendorPoItemEntity.RequestQty;
            vendPoItem.Status = vendorPoItemEntity.Status;
            Sdc.SubmitChanges();
        }
    }
}
